"""
日志配置工具
提供结构化的日志记录功能
"""

import json
import logging
import uuid
import sys
from datetime import datetime
from typing import Optional

class JSONFormatter(logging.Formatter):
    """
    自定义JSON格式化器，用于统一日志输出格式
    """
    
    def format(self, record: logging.LogRecord) -> str:
        """
        格式化日志记录为JSON格式
        """
        # 基本日志信息
        log_data = {
            "timestamp": datetime.fromtimestamp(record.created).isoformat(),
            "level": record.levelname,
            "logger": record.name,
            "message": record.getMessage(),
            "module": record.module,
            "function": record.funcName,
            "line": record.lineno
        }
        
        # 添加异常信息（如果存在）
        if record.exc_info:
            log_data["exception"] = self.formatException(record.exc_info)
            log_data["exception_type"] = record.exc_info[0].__name__
        
        # 添加额外的上下文信息
        extra_data = {}
        for key, value in record.__dict__.items():
            if key not in ['args', 'asctime', 'created', 'exc_info', 'exc_text', 
                          'filename', 'funcName', 'levelname', 'levelno', 'lineno',
                          'module', 'msecs', 'message', 'msg', 'name', 'pathname',
                          'process', 'processName', 'relativeCreated', 'stack_info',
                          'thread', 'threadName']:
                # 处理UUID对象，将其转换为字符串
                if isinstance(value, uuid.UUID):
                    extra_data[key] = str(value)
                else:
                    extra_data[key] = value
        
        if extra_data:
            log_data.update(extra_data)
            
        return json.dumps(log_data, ensure_ascii=False)

def setup_logging(
    level: str = "INFO",
    log_file: Optional[str] = None,
    console_output: bool = True
) -> None:
    """
    设置应用程序日志配置
    
    Args:
        level: 日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
        log_file: 日志文件路径，如果为None则不写入文件
        console_output: 是否输出到控制台
    """
    # 清除现有的日志处理器
    logging.getLogger().handlers.clear()
    
    # 创建根日志记录器
    logger = logging.getLogger()
    logger.setLevel(getattr(logging, level.upper()))
    
    # 创建格式化器
    formatter = JSONFormatter()
    
    # 控制台处理器
    if console_output:
        console_handler = logging.StreamHandler(sys.stdout)
        console_handler.setFormatter(formatter)
        logger.addHandler(console_handler)
    
    # 文件处理器
    if log_file:
        # 确保日志目录存在
        log_path = Path(log_file)
        log_path.parent.mkdir(parents=True, exist_ok=True)
        
        file_handler = logging.FileHandler(log_file, encoding='utf-8')
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)
    
    # 设置第三方库的日志级别
    logging.getLogger("urllib3").setLevel(logging.WARNING)
    logging.getLogger("requests").setLevel(logging.WARNING)

def get_logger(name: str) -> logging.Logger:
    """
    获取指定名称的日志记录器
    
    Args:
        name: 日志记录器名称
        
    Returns:
        logging.Logger实例
    """
    return logging.getLogger(name)

# 工具函数
def log_with_context(logger: logging.Logger, level: str, message: str, **kwargs):
    """
    带上下文的日志记录
    
    Args:
        logger: 日志记录器实例
        level: 日志级别
        message: 日志消息
        **kwargs: 额外的上下文信息
    """
    extra = kwargs.copy()
    log_method = getattr(logger, level.lower())
    
    if extra:
        # 使用标准的extra参数
        log_method(message, extra=extra)
    else:
        log_method(message)
